package 笔试;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeMap;
import java.util.TreeSet;

import com.sun.java.swing.plaf.windows.resources.windows;
import com.sun.org.apache.regexp.internal.recompile;

import sun.rmi.runtime.Log;
import util.LogUtils;
import util.TraverseUtils;
import 笔试.ComparatorDemo.Student;

/**
 * 哔哩哔哩 的校招编程题
 * @author Administrator
 * @Date 2017-09-30 01：22
 */
public class Bilibili {
	//测试数据
	private ArrayList<Node> data = new ArrayList<>();
	//敏感字符
	private ArrayList<String> words = new ArrayList<String>();
	private class Node {
		public Long sTime;	//开始时间
		public Long eTime;	//结束时间
		public String content;
		public Node(long sTime, long eTime, String content) {
			this.sTime = sTime;
			this.eTime = eTime;
			this.content = content;
		}
		/*
		 * Tree只需重写compareTo即可, 不需要equal！！我真是智障。。。
		 */
//		@Override
//		public int compareTo(Node that) {
//			//需求2: 过滤敏感字符
//			if (containWord(this.content))	 {
//				return 0;
//			}
//			//需求3: 小于3秒内同条弹幕过滤
//			if (this.content!=null && this.content.equals(that.content)
//						&& calTimeInterval(this.sTime, that.eTime)<3) {
//				return 0;
//			} 
//			if (this.sTime == that.sTime) {
//				//TODO:两条弹幕时间相同，但内容不同--(应该不会出现这种情况吧。。)
//				return this.sTime.compareTo(that.sTime);
//			} else {
//				return this.sTime.compareTo(that.sTime);
//			}
//
//		}
		@Override
		public String toString() {
			return "Node [sTime=" + sTime + ", eTime=" + eTime + ", content="
					+ content + "]";
		}
	}
	private List<Comparator<Node>> comps = new ArrayList<>();
	private Comparator<Node> compators = new Comparator<Bilibili.Node>() {
        @Override  
        public int compare(Node o1, Node o2) {  
        	//需求2: 过滤敏感字符
			if (containWord(o1.content))	 {
				return 0;
			}
			//需求3: 小于3秒内同条弹幕过滤
			if (o1.content!=null && o2.content!=null 
					&& o1.content.equals(o2.content)
						&& calTimeInterval(o1.sTime, o2.eTime)<3) {
				return 0;
			} 
        	//遍历比较器，实现多条件比较
            for (Comparator<Node> comparator : comps) {  
                if (comparator.compare(o1, o2) > 0)  
                    return 1;  
                else if (comparator.compare(o1, o2) < 0)   
                	return -1;  
            }  
            return 0;  
        }  
	};
	
	/**
	 * 比较器：比较 时间
	 */
	private Comparator<Node> compareStartTime = new Comparator<Bilibili.Node>() {
        @Override  
        public int compare(Node o1, Node o2) {  
            return o1.sTime.compareTo(o2.sTime);  
        }  
	};
	
	/**
	 * 比较器：比较 内容
	 */
	private Comparator<Node> compareContent = new Comparator<Bilibili.Node>() {
        @Override  
        public int compare(Node o1, Node o2) {  
            return o1.content.compareTo(o2.content);  
        }  
	};
	
	/**
	 * 计算时间间隔
	 * @param endTime1
	 * @param startTime2
	 * @return
	 */
	private long calTimeInterval(long endTime1, long startTime2) {
//		return Math.abs(endTime1-startTime2)/1000;		//转换为秒
		return Math.abs(endTime1-startTime2);
	}	
	
	private boolean containWord(String content) {
		for (String word : words) {
			if (content.indexOf(word)!=-1) {
				return true;
			}
		}
		return false;
	}

	private void initCompartors() {
		//根据比较器在comps集合中的顺序不同，先比较时间，再比较内容
		comps.add(compareStartTime);
		comps.add(compareContent);
	}
	/*
	 * 敏感字符
	 */
	private void initWords() {
		words.add("fuck");
		words.add("傻逼");
	}
	/*
	 * 测试数据
	 */
	private void initData() {
		/*
		 * 需求1：xml解析~~跳过吧。。。
		 * TODO:注：TreeSet第一个元素是不需要compareTo的。。一定会添加，即：第一个元素需要判断是否敏感字
		 */
		data.add(new Node(1, 2, "弹幕1"));	 		  //YES
		data.add(new Node(1, 2, "弹幕2"));	 		  //YES		//相同时间但是内容不同，可以加入并且排序稳定
		data.add(new Node(3, 4, "弹幕2"));	 		  //NOT	    //相同内容小于3秒无法加入
		data.add(new Node(7, 6, "考试做错了！！fuck！！"));//NOT			
		data.add(new Node(2, 3, "弹幕1"));	 		   //NOT
		data.add(new Node(3, 4, "弹幕1"));	 		   //NOT
		
		data.add(new Node(5, 6, "林星是傻逼"));		   //NOT	//敏感词无法加入
		data.add(new Node(8, 10, "弹幕3"));	 		   //YES
		data.add(new Node(9, 10, "弹幕1"));   		   //YES
		
		data.add(new Node(1, 4, "弹幕1"));    		   //NOT	//超过3秒可以加入
 
		data.add(new Node(7, 6, "林星是傻逼")); 		   //NOT
		data.add(new Node(7, 6, "考试做错了！！fuck！！")); //NOT
		data.add(new Node(7, 6, "弹幕2"));	 		    //YES	
	}
	

	public void start() {
		initCompartors();
		initWords();
		initData();
		TreeSet<Node> set = new TreeSet<Node>(compators);
		for (Node node : data) {
			set.add(node);
		}
		LogUtils.println("size>>>"+set.size());
		TraverseUtils.println4Set(set);		
	}
	public static void main(String[] args) {
		Bilibili obj = new Bilibili();
		obj.start();
	
	}
}
